
// Buffer node中16进制   内存的标识都是用二进制

// Buffer 表示内存 声明后无法扩充大小  
/**
 * 如何扩容 
 *  变大： 创造更大的内存，将数据拷贝过去
 *  变小： 截取内存
 * 
 *  */

// npm i @types/node type类型提示

//----------------------声明
let buf1 = Buffer.alloc(3) // 3 为字节单位
console.log(buf1) //<Buffer 00 00 00>

let buf2 = Buffer.from([0xff, 0xff, 0xff,])
console.log(buf2) //<Buffer ff ff ff>

// ---------------Buffer  string  转化
let buf3 = Buffer.from('江鹏')  // 文件可以用数buffer表示， 字符串 图片 文件等
console.log(buf3) //<Buffer e6 b1 9f e9 b9 8f>
console.log(buf3.toString('utf8')) // 江鹏
console.log(buf3.toString('base64')) // 5rGf6bmP

//------------------应用场景
const fs = require('fs')
const path = require('path')

let r = fs.readFileSync(path.resolve(__dirname, 'a.txt')) // fs读取为文件时 不指定编码 默认为buffer
console.log(r) //<Buffer e5 86 85 e5 ae b9> .
console.log(r[r.length - 1]) // 185  ascii码表中的位数


//-------------------buffer 截取 ------引用类型（buffer存的是内存地址）

const buf5 = Buffer.from([1, 2, 3, 4])
const buf6 = buf5.slice(0, 1)
console.log(buf5) //<Buffer 01 02 03 04>
buf6[0] = 100
console.log(buf5) // <Buffer 64 02 03 04>
console.log(buf6) //<Buffer 64>


//------------buffer 扩容 copy  concat   isBuffer

/**
 * @param {*} target  拷贝出的新Buffer  
 * @param {*} targetStart  新Buffer的起始位置  
 * @param {} sourceStart  被拷贝buffer的起始位置 
 * @param {} sourceEnd 被拷贝buffer的结束位置
 */
Buffer.prototype.myCopy = function (target, targetStart, sourceStart = 0, sourceEnd = this.length) {
    for (let i = sourceStart; i < sourceEnd; i++) {
        target[targetStart++] = this[i]
    }
}

const buf7 = Buffer.from('珠峰')
const buf8 = Buffer.from('架构')
console.log(buf7.length, buf8.length) // 6 6

const bufAdd = Buffer.alloc(12)
buf7.copy(bufAdd, 0, 0, 6)// 将buf7 拷贝到bufAdd上 从0 开始  直到结束
buf8.copy(bufAdd, 6, 0, 3)
console.log(buf7) //<Buffer e7 8f a0 e5 b3 b0>
console.log(buf8) //<Buffer e6 9e b6 e6 9e 84>
console.log(bufAdd) // <Buffer e7 8f a0 e5 b3 b0 e6 9e b6 00 00 00>
console.log(bufAdd.toString())  //珠峰架


Buffer.concat = function (bufList, len) {
    if (len == undefined) {
        len = bufList.reduce((n, c) => n + c.length, 0)
    }
    let bigBuf = Buffer.alloc(len)
    let offset = 0
    for (let i = 0; i < bufList.length; i++) {
        let buf = bufList[i]
        if (Buffer.isBuffer(buf)) {
            buf.copy(bigBuf, offset)
            offset += buf.length
        }
    }
    return bigBuf
}
console.log(Buffer.concat([buf7, buf8], 9).toString())  //珠峰架
